/***************************************************************************
 创建者: 华磊
 开始时间: 2019.3.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef FLEETDEFINE_H
#define FLEETDEFINE_H
//#include "instructionEnum.h"
#include "instructionEnum.h"
#include "globalDefine.h"
#include "GeneralDefine.h"



enum E_AGV_STATE
{
    E_AGV_STATE_IDILE=0,
    E_AGV_STATE_MOVING=1,
    E_AGV_STATE_LOSE_POSITION=2,
    E_AGV_STATE_LASER_CEASE=3,
    E_AGV_STATE_LASER_STOP=4,
    E_AGV_STATE_INFRARED_STOP=5,
    E_AGV_STATE_ULTRASONIC_STOP=6,
    E_AGV_STATE_CHARGING=7,
    E_AGV_STATE_CEASE=8,
    E_AGV_STATE_EMERGENCE_STOP=9,
    E_AGV_STATE_COMMAND_READY=10,
    E_AGV_STATE_ULTRASONIC_CEASE=100,
    E_AGV_STATE_INTERNAL_ERROR=101,

};

enum E_FLEET_TASK_STATUS
{
    E_FLEET_TASK_STATUS_IDILE=0,
    E_FLEET_TASK_STATUS_MOVING=1,
    E_FLEET_TASK_STATUS_CEASE=2,

};

enum E_FLEET_COMMAND
{
    E_FLEET_COMMAND_NONE=0,
    E_FLEET_COMMAND_LASER_PATH=1,
    E_FLEET_COMMAND_MAGANETIC_PATH=2,
    E_FLEET_COMMAND_ROLLER=3,
    E_FLEET_COMMAND_LIFT=4,
    E_FLEET_COMMAND_CHARGE=5,
    E_FLEET_COMMAND_MUSIC=6,
    E_FLEET_COMMAND_SET_VEL=7,
    E_FLEET_COMMAND_LOAD_MAP=8,
    E_FLEET_COMMAND_CLEAR_MESSAGE=9,
    E_FLEET_COMMAND_ROBOT_ARM_MOVE=10,
    E_FLEET_COMMAND_WAIT=11,
    E_FLEET_COMMAND_WAITDI=12,
    E_FLEET_COMMAND_SETDO=13,

};

struct LiftParameter
{
    /**
     * @brief liftType              升降类型
     */
    EM_LIFT_TYPE liftType;

    /**
     * @brief mechanismType         机构类型
     */
//    EM_MECHANISM_TYPE mechanismType;//not used

    /**
     * @brief timeOutValue           超时时间
     */
    int timeOutValue;
    bool isMonitorCargo;

};
enum E_ROLLER_TYPE
{
    E_ROLLER_TYPE_COMMON,
    E_ROLLER_TYPE_HEAVY,
};

enum E_ROLLER_STATE
{
    E_ROLLER_STATE_LEFT,
    E_ROLLER_STATE_RIGHT,
    E_ROLLER_STATE_STOP
};

struct RollerParameter
{
    /**
     * @brief rollerDirectionType           滚筒滚动方向类型
     */
    EM_ROLLER_DIRECTION_TYPE rollerDirectionType;

    /**
     * @brief rollerType                    滚筒机构类型
     */
//    EM_ROLLER_TYPE rollerType;//NOT USED

    /**
     * @brief timeOutValue           超时时间
     */
    int timeOutValue;
};

enum E_CHARGE_METHOD
{
    E_CHARGE_METHOD_VOLUME,
    E_CHARGE_METHOD_TIME,
    E_CHARGE_METHOD_VOLUME_TIME_FIRST
};
struct ChargeParameter
{
    /**
     * @brief chargingTime          充电时间
     */
    int chargingTime;

    /**
     * @brief chargingCaparity     充电容量
     */
    int chargingCaparity;

    /**
     * @brief chargingFinishedType      充电类型
     */
    EM_CHARGING_FINISH_TYPE chargingFinishedType;
};
struct MusicParameter
{
    /**
     * @brief musicFileName             音乐文件名
     */
    QString musicFileName;

    /**
     * @brief musicPlayTimes            播放次数
     */
    int musicPlayTimes;

    /**
     * @brief musicVolume               播放音量
     */
    int musicVolume;
};
struct AutoDriveParameter
{
   int targetStationId;
   double speedRatio;

};
struct WaitDiParameter
{
   int diIndex;
   bool waitCondition;

};
struct SetDoParameter
{
   int doIndex;
   bool doValue;

};
struct LoadMapParameter
{

    QString mapName;
    double x;//m
    double y;//m
    double r;//degree
};
struct MaganeticPathParameter
{
    E_MOVE_MAG_LMR_TYPE moveMagDirectionLMR;    //　左中右移动方向

    E_MOVE_MAG_FB_TYPE moveMagDirectionFB;      // 前后移动方向

    int velocityRatio;                          // 运动速度比

    QString rfidInternalValue;                  // RFID 标签数据

    E_MOVE_MAG_STOP_TYPE stopType;              // 停止类型

    int stopInputNum;                           // 开关量停止数值

    int stationId;//站点号
    int pathId;//路径号
};

struct RobotArmMoveParameter
{
    int moveType;
//    int pointType;//not used
    PointPro targetPoint;
    double velocityRatio;                          // 运行速度比
    int velocityType;
    int CNT_Value;                                  // 平滑数值  当CNT_Value=0:FINE
};


struct LaserPathParameter
{

    E_MOVE_FREE_MODE moveFreeMode;                 // 自由导航模式

    E_MOVE_FREE_POINTS_ARRY_TYPE pointArryType;    // 自由导航点位类型

    MOVE_FREE_POINT_TYPE pointSensorType;      // 自由导航指令点位模式

    QString trackMoveFileName;                      // 轨道运行文件路径

    quint32 velocityRatio;                          // 运行速度比

    quint32 pointsValue;                            // DP单点数值

    quint32 registerPointsValue;                    // DPR寄存器点数值

    QString noteStr;                                // 注释

    int CNT_Value;                                  // 平滑数值  当CNT_Value=0:FINE

    ENUM_MOVE_FREE_MOVE_TRAJECTORY_TYPE moveFreeMoveTrajectoryType;   // 自由导航指令运行轨迹类型；  AUTO:自由轨迹  LINE:直线轨迹  SPLINE:样条轨迹

    bool isPositiveDirection; //正向、反向运行。华磊
    float allowAccuracy;//停车精度，单位米


    /**
     * @brief pointIndex            点位类型索引,vmark类型 vmarkTypeNum
     */
    int pointIndex;

    /**
     * @brief laserTypeNum          激光类型编号
     */
    int laserTypeNum;

    /**
     * @brief jmpLabel              跳转标签
     */
    QString jmpLabel;

    /**
     * @brief jmpLabel              是否探测障碍物
     */
    bool isDetectBarrier; //是否探测障碍物
    int barrierRunMode;//探测方法
    /**
     * @brief pathControlStrategy 轨迹控制策略
     */
    E_PATH_CONTROL_STRATEGY    pathControlStrategy;

    VehiclePosition targetPosition;
    int stationId;//站点号
    int pathId;//路径号
//    double controlPointRatio1;//样条曲线开始控制比例
//    double controlPointRatio2;//样条曲线结束控制比例
//    bool isRotatePrepare;//是否旋转准备姿态。
//    double prepareAngle;//rad, 准备姿态角度。
    double p1x;
    double p1y;
    double p2x;
    double p2y;

};

struct FleetCommand
{
    int commandIndex;//第一条为０，后面依次增加１
    E_FLEET_COMMAND commandType;
    LaserPathParameter laserPathPara;
    MaganeticPathParameter maganeticPathPara;
    LiftParameter liftPara;
    RollerParameter rollerPara;
    ChargeParameter chargePara;
    MusicParameter musicPara;
    double velPara;
    LoadMapParameter mapPara;
    RobotArmMoveParameter robotArmMovePara;
    WaitDiParameter waitDiPara;
    SetDoParameter setDoPara;

};
struct FleetDebugInfo
{
    int commandQueueSize;
    E_FLEET_TASK_STATUS taskStatus;
    bool isLoopIdile;//执行器是否空闲
    int commandIndex;//最后一次加入的行号
    int executingLine;//正在执行的行号
    E_FLEET_COMMAND executingCommandType;

};

#endif // FLEETDEFINE_H
